package com.pai4j.sso.controller;

import com.pai4j.sso.handler.WxChatMsgFactory;
import com.pai4j.sso.handler.WxChatMsgHandler;
import com.pai4j.common.util.MessageUtil;
import com.pai4j.common.util.SHA1;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
import java.util.Objects;

/**
 * 微信公众号回调接口Controller
 *
 * @author: CYM-pai
 * @date: 2025/02/28 21:10
 **/
@RequestMapping("/oauth")
@RestController
@Slf4j
public class CallBackController {
    private static final String token = "pai4j";
    
    @Resource
    private WxChatMsgFactory wxChatMsgFactory;
    
   /**
    * 回调消息校验
    *
    * @author: CYM-pai
    * @date: 2025/02/28 21:25
    **/
   @GetMapping("/callback")
   public String callback(@RequestParam("signature") String signature,
                          @RequestParam("timestamp")String timestamp,
                          @RequestParam("nonce")String nonce,
                          @RequestParam("echostr")String echostr) {
       log.info("get验签请求参数：signature:{},timestamp:{},nonce:{},echostr:{}",
               signature, timestamp, nonce, echostr);
     String shaStr =  SHA1.getSHA1(token, timestamp, nonce, "");
     if(signature.equals(shaStr)) {
         return echostr;
     }
      return "unknown";
   }
    
    /**
     *回调消息处理
     *
     * @author: CYM-pai
     * @date: 2025/03/01 21:47
     **/
    @PostMapping(value = "callback", produces = "application/xml;charset=UTF-8")
    public String callback(
            @RequestBody String requestBody,
            @RequestParam("signature") String signature,
            @RequestParam("timestamp") String timestamp,
            @RequestParam("nonce") String nonce,
            @RequestParam(value = "msg_signature", required = false) String msgSignature) {
        log.info("接收到微信消息：requestBody：{}", requestBody);
        Map<String, String> messageMap = MessageUtil.parseXml(requestBody);
        String msgType = messageMap.get("MsgType");
        String event = messageMap.get("Event") == null ? "" : messageMap.get("Event");
        log.info("msgType:{},event:{}", msgType, event);
        
        StringBuilder sb = new StringBuilder();
        sb.append(msgType);
        if (!StringUtils.isEmpty(event)) {
            sb.append(".");
            sb.append(event);
        }
        String msgTypeKey = sb.toString();
        WxChatMsgHandler wxChatMsgHandler = wxChatMsgFactory.getHandlerByMsgType(msgTypeKey);
        if (Objects.isNull(wxChatMsgHandler)) {
            return "unknown";
        }
        String replyContent = wxChatMsgHandler.dealMsg(messageMap);
        log.info("replyContent:{}", replyContent);
        return replyContent;
    }
    
}
